{
 "cells": [
  {
   "metadata": {
    "collapsed": true
   },
   "cell_type": "markdown",
   "source": [
    "##### 为什么要拆分/分块/切分\n",
    "当拿到统一的Document对象后，接下来需要切分成Chunks。如果不切分，而是考虑作为一个整体的Document对象，会存在两点问题：\n",
    "    1、假设提问的Query的答案出现在某一个Document对象中，那么检索到的整个Document对象直接放入Prompt中并不是最优的选择，因为其中一定会包含\n",
    "       非常多无关的信息，而无效信息越多，对大模型后续的推理影响越大。\n",
    "    2、任何一个大模型都存在最大输入的Token限制，如果一个Document非常大，比如一个几百兆的pdf，那么大模型肯定无法容纳如此多的信息。\n",
    "\n",
    "基于此，一个有效的解决方案就是将完整的Document对象进行分块处理(Chunking)，无论是在存储还是检索过程中，都将以这些块(chunks)为基本单位，这样有效\n",
    "的避免内容不相关性问题和超出最大输入限制的问题。"
   ],
   "id": "522745dd618712b7"
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "##### Chunking拆分策略\n",
    "    方式1：根据句子切分：这种方法按照自然句子的边界进行切分，以保持语义完整性。\n",
    "    方式2：按照固定字符数来切分：这种策略根据特定的字符数量来划分文本，但可能会在不适当的位置切断句子。\n",
    "    方式3：按固定字符数来切分，结合重叠窗口：此方法与按字符切分相似，但通过重叠窗口技术避免切分关键内容，确保信息连贯性。\n",
    "    方式4：递归字符切分方法：通过递归字符方式动态确定切分点，这种方法可以根据文档的复杂性和内容密度来调整块大小。\n",
    "    方式5：根据语义内容切分：这种高级策略依据文本的语义内容来划分块，旨在保持相关信息的集中和完整，适用于需要高度语义保持的应用场景。"
   ],
   "id": "3fa4569b50627f33"
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
